#include "calculate.h"
#include <stdio.h>
#include <pthread.h>
#include <mutex>

const char *const calculate_print_format = "[calculate] a=%lf,b=%lf,op=%c\n";

struct StructTest {
    int i = 1;
    char *x;
};

const StructTest struct_test = {2, (char*) calculate_print_format};
// struct_test.calculate_print_format = (char *) calculate_print_format;

pthread_once_t once_flag = PTHREAD_ONCE_INIT;
static pthread_once_t once_flag2 = PTHREAD_ONCE_INIT;

void init_function() {
    printf("This runs only once!\n");
}

void* thread_func(void* arg) {
    pthread_once(&once_flag, init_function);
    return NULL;
}

void init_function2() {
    printf("This runs only once!\n");
}

void* thread_func2(void* arg) {
    pthread_once(&once_flag2, init_function2);
    return NULL;
}

// void decryptFunction() {
//     static std::once_flag flag;
//     std::call_once(flag, []{
//         // 实际的解密逻辑
//         printf("decryptFunction 实际的解密逻辑\n");
//     });
// }


double calculate(double a, double b, char op) {
    printf(calculate_print_format, a, b, op);
    // switch (op) {
    //     case '+': return a + b;
    //     case '-': return a - b;
    //     case '*': return a * b;
    //     case '/':
    //         if (b != 0)
    //             return a / b;
    //         else
    //             // return 0.0 / 0.0; // NaN
    //             return -1; // NaN
    //     default:
    //         // return 0.0 / 0.0; // NaN
    //         return -1; // NaN
    // }

    if (op == '+') {
        return a + b;
    } else if (op == '-') {
        return a - b;
    } else if (op == '*') {
        return a * b;
    } else if (op == '/') {
        if (b != 0) {
            return a / b;
        } else {
            // 当除数为0时返回一个表示NaN的值
            return -1; // 使用-1来代表NaN，这里根据实际需求可以选择更合适的值或方式来表示NaN
        }
    } else {
        // 对于不支持的操作符，返回一个表示NaN的值
        return -1; // 同样，这里的-1是示例，实际应用中应选择合适的方式表示操作无效或者结果未定义的情况
    }
}

#ifndef MY_BUILD_ALL
int main(int argc, char const *argv[]) {
    printf("struct_test str=%s,i=%d\n", struct_test.x, struct_test.i);

    // printf("div 0=%lf\n", calculate(0, 0, '/'));
    // printf("div 1=%lf\n", calculate(1, 2, '/'));
    // printf("add=%lf\n", calculate(1, 2, '+'));
    // printf("sub=%lf\n", calculate(1, 2, '-'));
    calculate(0, 0, '/');
    calculate(1, 2, '/');
    calculate(1, 2, '+');
    calculate(1, 2, '-');
    return 0;
}
#endif